import type { VideoType } from '@prisma/client';
import { headers, cookies } from 'next/headers';
import { SESSION_COOKIE_NAME, VIP_STATUS } from '../types/session';
import { SessionRepository } from '../database/repositories/session-repository';

/**
 * 获取VIP状态（通过会话系统）
 * @returns VIP状态值
 */
export async function getVipStatus(): Promise<number> {
  try {
    const cookieStore = await cookies();
    const sessionCookie = cookieStore.get(SESSION_COOKIE_NAME);
    
    if (!sessionCookie) {
      return VIP_STATUS.NORMAL;
    }
    
    const session = await SessionRepository.getById(sessionCookie.value);
    
    if (!session || session.expiresAt < new Date()) {
      return VIP_STATUS.NORMAL;
    }
    
    return session.isVip ? VIP_STATUS.VIP : VIP_STATUS.NORMAL;
  } catch (error) {
    console.error('获取VIP状态失败:', error);
    return VIP_STATUS.NORMAL;
  }
}

/**
 * 检查用户是否有VIP权限（通过会话系统）
 * @returns 是否为VIP用户
 */
export async function checkVipAccess(): Promise<boolean> {
  const vipStatus = await getVipStatus();
  return vipStatus === VIP_STATUS.VIP;
}

/**
 * 判断用户是否为VIP
 * @returns 是否为VIP用户
 */
export async function isVip(): Promise<boolean> {
  const headersList = await headers();
    return getXIsVipFromHeaders(headersList);
}

/**
 * 检查分类是否可访问
 * @param type 分类对象
 * @returns 是否可访问
 */
export async function isTypeAccessible(type: VideoType): Promise<boolean> {
  // 如果分类不可见，直接返回false
  if (!type.isVisible) {
    return false;
  }

  // 如果是VIP专属分类，但用户不是VIP
  if (type.isVip && !(await isVip())) {
    return false;
  }

  return true;
}

/**
 * 检查用户是否有权限访问视频
 * @param isVipContent 是否是VIP内容
 * @param isVisibleContent 是否是可见内容
 * @returns 是否有权限访问
 */
export async function hasContentAccess(isVipContent: boolean, isVisibleContent: boolean): Promise<boolean> {
  // 如果内容不可见，任何用户都无权访问
  if (!isVisibleContent) {
    return false;
  }

  // 如果是VIP专属内容，只有VIP用户可以访问
  if (isVipContent) {
    return await isVip();
  }

  // 普通内容，所有用户都可以访问
  return true;
}

/**
 * 从请求头中获取 x-is-vip 参数
 * @param headers 请求头对象
 * @returns x-is-vip 参数的值，如果不存在则返回 null
 */
export function getXIsVipFromHeaders(headers: Headers): boolean {
  return headers.get('x-is-vip') === 'true';
} 